package com.lang.instrument.instrumentation;

import org.junit.Test;

/**
 * https://www.ibm.com/developerworks/cn/java/j-lo-jse61/
 *
 * Instrumentation，开发者可以构建一个独立于应用程序的代理程序（Agent），用来监测和协助运行在 JVM 上的程序，甚至能够通过修改方法的字节码实现动态替换和修改某些类的定义。
 *
 * “java.lang.instrument”包的具体实现，依赖于 JVMTI。JVMTI（Java Virtual Machine Tool Interface）是一套由 Java 虚拟机提供的，
 * 为 JVM 相关的工具提供的本地编程接口集合。除开 Instrumentation 功能外，JVMTI 还在虚拟机内存管理，线程控制，方法和变量操作等等方面提供了大量有价值的函数。。
 */
public class InstrumentationDemo {

    /**
     * 将特定的包含instrument类的jar被BootstrapClassLoader加载。
     * 必须保证agent jar里面的所有类都已经被BootstrapClassLoader加载，即里面的类不能被其余的类加载器加载。
     * 解决方法，让agent代理类里面的所有类的包名与target JVM里面的类名区分
     */
    @Test
    public void appendToBootstrapClassLoaderSearch(){
//        inst.appendToBootstrapClassLoaderSearch(
//                new JarFile(AgentLauncher.class.getProtectionDomain().getCodeSource().getLocation().getFile())
//        );
    }

}
